<?php

namespace app\backend\controller;

use app\common\controller\Basic;
use app\common\service\sys\FilesGroupService;
use app\common\service\sys\FilesService;
use app\common\service\hrm\CompanyService;

/**
 * 上传文件控制器
 * @auth kaige
 * @update 2022-05-07
 */
class Files extends Basic
{
  protected $fgservice;
  // 初始化
  protected function initialize()
  {
    parent::initialize();
    // 当前控制器服务实例化
    $this->service = new FilesService();
    $this->fgservice = new FilesGroupService();
  }
  /**
   * 列表
   */
  public function index()
  {
    if ($this->request->isGet()) {
      $data = input('param.');
      $data['user_id'] = $this->user['id'];
      return json($this->service->_list($data));
    }
    return _jerr(1000);
  }

  /**
   * 删除
   */
  public function del()
  {
    if ($this->request->isPost()) {
      $id = input('id/s', '');
      return json($this->service->delFiles($id));
    }
    return _jerr(1000);
  }

  /**
   * 分组列表
   * @return json
   */
  public function groupList()
  {
    if ($this->request->isGet()) {
      $group = $this->fgservice->getListAll();
      return _jok('ok', $group);
    }
    return _jerr(1000);
  }

  /**
   * 添加分组
   */
  public function addGroup()
  {
    if ($this->request->isPost()) {
      $data = input();
      return json($this->fgservice->addGroup($data));
    }
    return _jerr(1000);
  }

  /**
   * 移入分组
   */
  public function moveGroup()
  {
    if ($this->request->isPost()) {
      $data = $this->request->param();
      // 接收表单数组的处理 如 input name="files_ids[]" 
      $arr_count = $data['files_ids']; // 这个变量，前端传过来的是 数组长度 （非下标，最大下标得 -1）；
      $newArr = [];
      for ($i = 0; $i < $arr_count; $i++) {
        $keyname = 'files_ids_' . $i; // 与前端保持统一 如表单里 name="files_ids[]" 则这里是 files_ids_  xxxx[]对应xxxx_
        if (isset($data[$keyname]) && $data[$keyname] != '') {
          $newArr[] = $data[$keyname];
        }
      }
      $indata = [
        'files_ids' => $newArr,
        'group_id' => $data['group_id']
      ];
      $res = $this->service->moveGroup($indata);
      return json($res);
    }
    return _jerr(1000);
  }

  /**
   * 删除分组
   */
  public function deleteGroup()
  {
    if ($this->request->isPost()) {
      $group_id = input('param.group_id/d', 0);
      return json($this->fgservice->deleteGroup($group_id));
    }
    return _jerr(1000);
  }

  /**
   * 获取文件信息
   */
  public function getfileinfo()
  {
    if ($this->request->isGet()) {
      $id = input('id/s', '');
      return _jok('',$this->service->getInfoById($id));
    }
    return _jerr(1000);
  }

  /**
   * 上传文件(支持批量)  集文档、图片、视频
   */
  public function upfiles()
  {
    //前端 分组ID 用的是 id （非group_id） 因多个页面需要调用 故省了group_
    $group_id = $this->request->param('id/d', 7); //默认7 未分类
    if ($this->request->isPost()) { //保存
      $key_name = "files"; // 前端input的name
      //接收上传的文件
      $files = $this->request->file($key_name); //文件(可以是多个，数组形式)
      if (empty($files)) {
        $file2 = $this->request->file('file');
        if (empty($file2)) {
          return _jerr('缺少文件');
        }
        $files[0] = $file2;
        $key_name = 'file';
      }
      $uid = $this->user['id'];
      if (empty($uid)) {
        return _err(2101);
      }

      $company_id = isset($this->user['company_id']) ? $this->user['company_id'] : env('COMPANY_ID',11); // 用户绑定的公司，谁传的指向其单位，默认指向11
      $browser = getOS() . '|' . getBrowser();
      $result = $this->service->upfiles($files, $uid, [
        'key_name' => $key_name,
        'group_id' => $group_id,
        'company_id' => $company_id,
        'browser' => $browser,
      ]);
      return json($result);
    }
    if ($this->request->isGet()) { //页面所需
      $outdata = [
        'id' => $group_id,
        'userinfo' => [
          'company_id' => $this->user['company_id'],
          'real_name' => $this->user['real_name']
        ],
        'companyList' => CompanyService::getCompanyList(),
      ];
      return _jok('ok', $outdata);
    }
    return _jerr(1000);
  }

  /**
   * 下载文件
   */
  public function down()
  {
    $id = input('id', '');
    if (empty($id)) {
      return _jerr(1002);
    } else {
      $fileInfo = $this->service->getInfoById($id);
      if ($fileInfo) {
        $filePath = app()->getRootPath() . 'public' . $fileInfo['path'];
        // 检查文件是否存在
        if (!file_exists($filePath)) {
          header('HTTP/1.1 404 NOT FOUND');
        } else {
          // 以只读和二进制模式打开文件
          $file = fopen($filePath, "rb");
          // 告诉浏览器这是一个文件流格式的文件
          Header("Content-type: application/octet-stream");
          // 请求范围的度量单位
          Header("Accept-Ranges: bytes");
          // Content-Length是指定包含于请求或响应中数据的字节长度
          Header("Accept-Length: " . filesize($filePath));
          // 用来告诉浏览器，文件是可以当做附件被下载，下载后的文件名称为$file_name该变量的值。
          Header("Content-Disposition: attachment; filename=" . md5($fileInfo['hash']) . '.' . $fileInfo['file_ext']);
          //ob_clean(); // 重点！！！
          //flush(); // 重点！！！！可以清除文件中多余的路径名以及解决乱码的问题
          // 读取文件内容并直接输出到浏览器
          echo fread($file, filesize($filePath));
          fclose($file);
        }
      } else {
        return _jerr(1002);
      }
    }
  }
}
